home *** CD-ROM | disk | FTP | other *** search
/ .net 2002 March / DotNetMagazine-Issue107-Coverdisc-NET107-02-03-PCMac.bin / pc / PC Software / free_browsing / DavesQckSearchDbar3-14 / dqsd.exe / history.js < prev    next >
Text File  |  2002-07-26  |  5KB  |  237 lines

  1. // fancy UI: history and cut and paste (via arrow and control keys)
  2.  
  3. histarray = [];
  4. histedit = new Array(historylength + 1);
  5. histcurr = 0;
  6.  
  7. restoreHistory();
  8.  
  9. // save the history array
  10. function saveHistory()
  11. {
  12.   try
  13.   {
  14.     writeFile("history.txt", histarray.join('\r\n'));
  15.   }
  16.   catch(e) { }
  17. }
  18.  
  19. // restore at most historylength entries from the saved history
  20. function restoreHistory()
  21. {
  22.   var historyFileContent = null;
  23.   try
  24.   {
  25.     historyFileContent = readFile("history.txt");
  26.   }
  27.   catch (e) {}
  28.   
  29.   var loaded = null;
  30.   if (historyFileContent)
  31.     loaded = historyFileContent.replace(/\r\n/g, '\n').split('\n');
  32.   else // history.txt probably doesn't exist
  33.     loaded = new Array(0);
  34.  
  35.   for (var i = loaded.length - 1; i >= 0; i--)
  36.   {
  37.     if (loaded[i] && loaded[i] != "")
  38.       histarray.push(loaded[i]);
  39.     if (histarray.length >= historylength)
  40.       break;
  41.   }
  42.   histarray.reverse();
  43.   histcurr = histarray.length;
  44.   histedit[histarray.length] = "";
  45. }
  46.  
  47. // add an item to the history
  48. function addhist(t)
  49. {
  50.   // See if it's already in the history so we can remove it
  51.   var i;
  52.   for (i = 0; i < histarray.length; i++)
  53.     if (histarray[i] == t) break;
  54.  
  55.   // Not there, but history is maxed out: remove the 0th.
  56.   if (i == histarray.length && histarray.length == historylength)
  57.     i = 0;
  58.     
  59.   // Shift down all the entries after the one to be removed
  60.   for (; i < histarray.length - 1; i++)
  61.     histarray[i] = histarray[i + 1];
  62.  
  63.   // Store the new item in the history
  64.   histarray[i] = t;
  65.     
  66.   // Save it baby
  67.   saveHistory();
  68.  
  69.   // History edits get cleared whenever something new goes in
  70.   clearhistedits();
  71.   histcurr = i + 1;
  72. }
  73.  
  74. // get the current history entry
  75. function currhistedit()
  76. {
  77.   if (histedit[histcurr] != null)
  78.     return histedit[histcurr];
  79.   if (histcurr >= histarray.length)
  80.     return (histcurr > 0 ? histarray[histarray.length - 1] : "");
  81.   return histarray[histcurr];
  82. }
  83.  
  84. // clear the history edits
  85. function clearhistedits()
  86. {
  87.   for (var i = 0; i < histedit.length; i++)
  88.   {
  89.     histedit[i] = null;
  90.   }
  91. }
  92.  
  93. // advance the currently viewed history entry +1 or -1
  94. function histeditmove(t, i)
  95. {
  96.   if (t != currhistedit())
  97.     histedit[histcurr] = t;
  98.  
  99.   // special case: first ctrl-p and no edits were done
  100.   if (i == -1 && histcurr == histarray.length && histedit[histcurr] == null)
  101.   {
  102.     histedit[histcurr] = "";
  103.     if (histcurr > 0) histcurr--;
  104.   }
  105.     
  106.   // no movement
  107.   if (i == 0) return;
  108.  
  109.   // filter when somebody has typed !prefix then ctrl-p
  110.   var scan = histcurr + i;
  111.   if (scan > histarray.length || scan < 0) return;
  112.  
  113.   var filter = histedit[histarray.length];
  114.   if (filter != null && filter.match(/^!\S/) && filter != "!!")
  115.     filter = "\\b" + filter.substring(1);
  116.   else if (filter != null && filter.match(/\S!$/) && filter != "!!")
  117.     filter = "\\b" + filter.substring(0,filter.length - 1);
  118.   else filter = "";
  119.  
  120.   while (scan < histarray.length && !histarray[scan].match(filter))
  121.   {
  122.     scan += i;
  123.     if (scan < 0) return;
  124.   }
  125.  
  126.   histcurr = scan;
  127. }
  128.  
  129. function histsearch( t, shift )
  130. {
  131.   if ( searchPrefix == '' )
  132.     searchPrefix = t;
  133.  
  134.   // Escape every letter in the searchPrefix, because it might contain chars with special meaning in a regexp
  135.   var escapedString = escapeString( searchPrefix );
  136.  
  137.   var re;
  138.   try
  139.   {
  140.     re = new RegExp( escapedString, "i" );
  141.   }
  142.   catch(e)
  143.   {
  144.     alert("An error (" + e.description + ") occurred during the history search");
  145.     return;
  146.   }
  147.   
  148.   if (!shift) // Search back through history
  149.   {
  150.     for ( var i = histcurr - 1; i >= 0; i-- )
  151.     {
  152.       if ( histarray[i].match( re ) )
  153.       {
  154.         histcurr = i;
  155.         document.deff.q.value = currhistedit();
  156.         return;
  157.       }
  158.     }
  159.  
  160.     for ( var i = histarray.length - 1; i >= histcurr; i-- )
  161.     {
  162.       if ( histarray[i].match( re ) )
  163.       {
  164.         histcurr = i;
  165.         document.deff.q.value = currhistedit();
  166.         return;
  167.       }
  168.     }
  169.   }
  170.   else // Search forward through history
  171.   {
  172.     for ( var i = histcurr + 1; i < histarray.length; i++ )
  173.     {
  174.       if ( histarray[i].match( re ) )
  175.       {
  176.         histcurr = i;
  177.         document.deff.q.value = currhistedit();
  178.         return;
  179.       }
  180.     }
  181.  
  182.     for ( var i = 0; i <= histcurr; i++ )
  183.     {
  184.       if ( histarray[i].match( re ) )
  185.       {
  186.         histcurr = i;
  187.         document.deff.q.value = currhistedit();
  188.         return;
  189.       }
  190.     }
  191.   }
  192. }
  193.  
  194.  
  195. // recent changes a !foo textbox into whatever it means
  196. // it returns false if there is no match
  197.  
  198. function recent()
  199. {
  200.   var t = escapeString( document.deff.q.value );
  201.  
  202.   if (!t.match(/^!\S/)) return true;
  203.  
  204.   if (t == "!!")
  205.   {
  206.     histcurr = histarray.length;
  207.     histeditmove(t, -1);
  208.     if (histcurr == histarray.length) return false;
  209.   }
  210.   else
  211.   {
  212.     // this bit of code searches backwards for !foo
  213.  
  214.     // set the filter then behave like a ctrl-p
  215.     histcurr = histarray.length;
  216.     histeditmove(t, -1);
  217.  
  218.     // return true if no match
  219.     if (histcurr == histarray.length) return false;
  220.   }
  221.  
  222.   document.deff.q.value = currhistedit();
  223.   return true;
  224. }
  225.  
  226. function escapeString( s )
  227. {
  228.   if ( !s.length )
  229.     return s;
  230.   var es = '';
  231.   for (var i = 0; i < s.length; i++)
  232.   {
  233.     es += "\\x" + s.charCodeAt(i).toString(16);
  234.   }
  235.   return es;
  236. }
  237.